﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<list>
#include<fstream>
#include<sstream>
using namespace std;

// C++的IO流

//int main()
//{
//	ostream out(nullptr);
//
//	cerr << "xxxxxxxxx" << endl;
//	clog << "yyyyyyyyy" << endl;
//
//	cout.put(49);
//
//	// while条件判断：bool 整型 指针
//	// istream可以隐式类型转换成bool
//	string s1;
//	// istream& operator>> (istream& is, string& str);
//	//while (cin >> s1)
//	while (operator>>(cin, s1))
//	{
//		cout << s1 << endl;
//	}
//
//	return 0;
//}


// 类型转换
// 1.内置类型之间，相近类型可以转换
// 2.构造函数，其他类型转换成自定义类型，有构造函数就可以支持
//		内置类型 -> 自定义类型		自定义类型 -> 自定义类型
// 3.operator type()	自定义类型 -> 内置类型
class C
{
public:
	C(int x)
	{}
};

class D
{
public:
	D(const C& c)
	{}
};

class E
{
public:
	operator int()
	{
		// ...
		return 0;
	}
};

//int main()
//{
//	int* p = nullptr;
//	int i = (int)p;
//
//	// 内置类型 -> 自定义类型		
//	C c1 = 11;
//	string s = "aaaaaaa";
//
//	// 自定义类型 -> 自定义类型
//	D d1 = c1;
//	list<int> lt;
//	list<int>::const_iterator it = lt.begin();
//
//	// 自定义类型 -> 内置类型
//	E e;
//	int x = e;
//	cout << x << endl;
//
//	return 0;
//}


//class Date
//{
//	friend ostream& operator << (ostream& out, const Date& d);
//	friend istream& operator >> (istream& in, Date& d);
//public:
//	Date(int year = 1, int month = 1, int day = 1)
//		:_year(year)
//		, _month(month)
//		, _day(day)
//	{}
//	operator bool()
//	{
//		// 这里是随意写的，假设输入_year为0，则结束
//		if (_year == 0)
//			return false;
//		else
//			return true;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//istream& operator >> (istream& in, Date& d)
//{
//	in >> d._year >> d._month >> d._day;
//	return in;
//}
//
//ostream& operator << (ostream& out, const Date& d)
//{
//	out << d._year << " " << d._month << " " << d._day;
//	return out;
//}
//
//// C++ IO流，使用面向对象+运算符重载的方式
//// 能更好的兼容自定义类型，流插入和流提取
//int main()
//{
//	// 自动识别类型的本质--函数重载
//	// 内置类型可以直接使用--因为库里面ostream类型已经实现了
//	int i = 1;
//	double j = 2.2;
//	cout << i << endl;
//	cout << j << endl;
//
//	// 自定义类型则需要我们自己重载<< 和 >>
//	Date d(2022, 4, 10);
//	cout << d;
//	while (d)
//	{
//		cin >> d;
//		cout << d;
//	}
//
//	return 0;
//}


//int main()
//{
//	int i = 0;
//	int j = 0;
//	cin.sync_with_stdio(false);
//	cout.sync_with_stdio(false);
//
//	cin >> i;
//	scanf("%d", &j);
//
//	cout << i << endl;
//	cout << j << endl;
//
//	return 0;
//}


// C++的文件IO流
class Date
{
	friend ostream& operator << (ostream& out, const Date& d);
	friend istream& operator >> (istream& in, Date& d);
public:
	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{}

	operator bool()
	{
		// 这里是随意写的，假设输入_year为0，则结束
		if (_year == 0)
			return false;
		else
			return true;
	}
private:
	int _year;
	int _month;
	int _day;
};

istream& operator >> (istream& in, Date& d)
{
	in >> d._year >> d._month >> d._day;
	return in;
}

// ofs << winfo._date;
ostream& operator << (ostream& out, const Date& d)
{
	//out << d._year << "年" << d._month << "月" << d._day << "日";
	out << d._year << " " << d._month << " " << d._day;
	return out;
}

struct ServerInfo
{
	// char _address[32];
	// 二进制读写数据时，有容器都要小心
	// 不能用二进制方式写容器
	string _address;
	double _x;

	Date _date;
};

// 要求写到文件，再读出来
// 1.二进制读写
// 2.文本读写
class BinIO
{
public:
	BinIO(const char* filename = "info.bin")
		: _filename(filename)
	{}

	void Write(const ServerInfo& winfo)
	{
		ofstream ofs(_filename, ofstream::out | ofstream::binary);
		ofs.write((char*)&winfo, sizeof(winfo));
	}

	void Read(ServerInfo& rinfo)
	{
		ifstream ifs(_filename, ofstream::in | ofstream::binary);
		ifs.read((char*)&rinfo, sizeof(rinfo));
	}

private:
	string _filename;
};

//// 写
//int main()
//{
//	ServerInfo winfo = { "192.0.0.1", 9.30, { 2022, 4, 10 } };
//
//	BinIO bin;
//	bin.Write(winfo);
//
//	return 0;
//}

//// 读
//int main()
//{
//	ServerInfo info;
//	BinIO bin;
//	bin.Read(info);
//
//	cout << info._address << endl;
//	cout << info._x << endl;
//	cout << info._date << endl;
//
//	return 0;
//}

// 2.文本读写
class TextIO
{
public:
	TextIO(const char* filename = "info.txt")
		: _filename(filename)
	{}

	void Write(const ServerInfo& winfo)
	{
		ofstream ofs(_filename);
		ofs << winfo._address << endl;
		ofs << winfo._x << endl;
		ofs << winfo._date << endl;
	}

	void Read(ServerInfo& rinfo)
	{
		ifstream ifs(_filename);
		ifs >> rinfo._address;
		ifs >> rinfo._x;
		ifs >> rinfo._date;
	}

private:
	string _filename;
};

//// 写
//int main()
//{
//	ServerInfo winfo = { "https://gitee.com/A-Dragon-Long/Cpp_advanced", 9.30, { 2022, 4, 10 } };
//
//	TextIO text;
//	text.Write(winfo);
//
//	//// C语言中double转字符串
//	//double x = 2.22;
//	//char buff[128];
//	//sprintf(buff, "%lf", x);
//
//	//// cpp
//	//to_string(x);
//
//	return 0;
//}

//// 读
//int main()
//{
//	ServerInfo info;
//	TextIO text;
//	text.Read(info);
//	
//	cout << info._address << endl;
//	cout << info._x << endl;
//	cout << info._date << endl;
//
//	return 0;
//}

//int main()
//{
//	char sql1[128];
//	char name[10];
//	scanf("%s", name);
//
//	sprintf(sql1, "select * from t_score where name = '%s'", name);
//	printf("%s\n", sql1);
//
//	string sq2;
//	sq2 += "select * from t_score where name = '";
//	sq2 += name;
//	sq2 += "'";
//	cout << sq2 << endl;
//
//	Date d(2025, 9, 30);
//
//	/*ostringstream oss;
//	oss << d;
//
//	string sq3;
//	sq3 += "select * from t_data where date = '";
//	sq3 += oss.str();
//	sq3 += "'";
//	cout << sq3 << endl;*/
//
//	ostringstream sqloss;
//	sqloss << "select * from t_data where date = '" << d << "'";
//	cout << sqloss.str() << endl;
//
//	return 0;
//}

struct ChatInfo
{
	string _name; // 名字
	int _id;      // id
	Date _date;   // 时间
	string _msg;  // 聊天信息
};

int main()
{
	ChatInfo winfo = { "张三", 135246, { 2022, 4, 10 }, "晚上一起看电影吧" };

	stringstream oss;
	oss << winfo._name << endl;
	oss << winfo._id << endl;
	oss << winfo._date << endl;
	oss << winfo._msg << endl;
	cout << oss.str() << endl;

	// 网络输出
	ChatInfo rinfo;
	string str = oss.str();
	stringstream iss(str);
	iss >> rinfo._name;
	iss >> rinfo._id;
	iss >> rinfo._date;
	iss >> rinfo._msg;

	cout << "-------------------------------------------------------" << endl;
	cout << "姓名：" << rinfo._name << "(" << rinfo._id << ") ";
	cout << rinfo._date << endl;
	cout << rinfo._name << ":>" << rinfo._msg << endl;
	cout << "-------------------------------------------------------" << endl;

	return 0;
}
